package com.zwh.se.io;


import com.zwh.se.common.pojo.Student;

import java.io.*;

/**
 * @author zwh
 * 对象流，是用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中，也能把对象从数据源中还原回来。
 * ObjectOutputStream:把内存中的Java对象转换成平台无关的二进制数据，从而允许把这种二进制数据持久地保存在磁盘上，或通过网络将这种二进制数据传输到另一个网络节点。->序列化
 * ObjectInputStream：当其它程序获取了这种二进制数据，就可以通过该流将其恢复成原来的Java对象。->反序列化
 * <p>
 * 操作需要进行序列化的对象，该对象的类必须实现Serializable接口才能使用
 */
public class ObjectInputOutputStreamDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        String file = "file/objectStream.txt";
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
        //构造一个对象，将其写出到文件当中去
        Student student = new Student(13L, "Will", 17, 17);
        objectOutputStream.writeObject(student);
        //演示:哪怕是常见的字符串对象也罢,你在写出后也是看不懂的,因为其所转成的二进制数据是以对象作为基准而非字符
        objectOutputStream.writeObject("你好");
        objectOutputStream.close();
        //将文件中保存的字符串 读入到 内存 中
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
        Student obj = null;
        try {
            obj = (Student) objectInputStream.readObject();
        } catch (InvalidClassException e) {
            //测试本异常的出现请根据原理自己尝试哦,提示是需要注释掉某些东西
            System.out.println("\033[31;4m" + e + "\033[0m");
            System.out.println("出现该异常的原因是因为序列化之后，你又对原对象的类实例做了修改，且该类实例也没有serialVersionUID常量");
        }
        System.out.println(obj);
        String s = (String) (objectInputStream.readObject());
        System.out.println(s);
        objectInputStream.close();
    }
}
